var Tape = function (cv) {
    /**
     * 每次点击画板,随机生成一条从左到右横跨的不规则纸带.
     */
    var ctx = cv.getContext('2d');
    cv.width = window.innerWidth;
    cv.height = window.innerHeight;
    var W = cv.width, H = cv.height, MAXLEN = 90, TIME = 40;
    //以r为颜色度量，生成颜色
    function ranColor(r) {
        return '#' + (Math.cos(r) * 127 + 128 << 16 | Math.cos(r + Math.PI * 2 / 3) * 127 + 128 << 8 | Math.cos(r + Math.PI * 4 / 3) * 127 + 128).toString(16);
    }
    /**
     * 已知三角形的两个点p0,p1,随机确定第三个点,以此为边画一个三角形
     * @param {Object} p0   第一个点,包含x,y坐标值
     * @param {Object} p1   第二个点,包含x,y坐标值
     * @param {Object} r    三角形的颜色度量
     */
    function drawTriangle(p0, p1, r) {
        var p2 = thirdP(p1);
        ctx.beginPath();
        ctx.moveTo(p0.x, p0.y);
        ctx.lineTo(p1.x, p1.y);
        ctx.lineTo(p2.x, p2.y);
        ctx.closePath();
        ctx.fillStyle = ranColor(r);
        ctx.fill();
        return [p1, p2];
    }
    /**
     * 已知三角形的第二个点p1,随机确定第三个点
     * @param {Object} p1   第二个点,包含x,y坐标值
     * @return {Object}     第三个点,包含x,y坐标值
     */
    function thirdP(p1) {
        var x = p1.x + (Math.random() * 2 - 0.25) * MAXLEN;
        var y = repeatFind(p1.y, H);
        return { x: x, y: y };
    }
    /**
     * @param {number} y  y坐标值
     * @return {number}   随机坐标,必须在0到maxH之间,否则反复生成
     */
    function repeatFind(y, maxH) {
        var newY = y + (Math.random() * 2 - 1.1) * MAXLEN;
        return newY > 0 && newY < maxH ? newY : repeatFind(y, maxH);
    }
    var r = 0;
    function drawAll() {
        ctx.clearRect(0, 0, W, H);
        ctx.globalAlpha = 0.6;
        var p0 = { x: 0, y: H / 2 }, p1 = { x: 0, y: H / 3 };
        var timer = setTimeout(function task() {
            if (p1.x < W + MAXLEN) {
                _a = drawTriangle(p0, p1, r), p0 = _a[0], p1 = _a[1];
                r -= Math.PI * 2 / -50;
                setTimeout(task, TIME);
            }
            else {
                clearTimeout(timer);
            }
            var _a;
        }, TIME);
    }
    cv.onclick = drawAll;
    drawAll();
};
